import java.util.ArrayList;

/**
 * Classe que representa um vagão para carregar líquidos.
 */
public class VagaoLiquidos extends Vagao {


	/**
	 * Representa conteúdo sendo usado atualmente.
	 */
	private ConteudoLiquido conteudo;

	/**
	 * Variável usada para representar a capacidade do vagão
	 */
	private int capacidade;
	/*meus atributos para resolução*/
	private ArrayList<ConteudoLiquido> liquidostranspotaveis;//define os tipos que o vagao pode transportar
	protected boolean inflamabilidade;//método de acesso set e get se privada!
	private int quantidadeatualcarregada = 0;//uma instância qualquer vagaoliquidos inicia com nenhuma carga carregada
	private int ocupacao;
	/* TODO inicializar variáveis internas
	 * Nota: "conteudos" representa os conteúdos aceitos pelo vagão, você deve implementar
	 * a representação disso como achar conveniente (pode/deve criar novo atributo).
	 * Olhe a descrição do método
	 * conteudosAceitos() antes de implementar isso.
	 * 
	 * A variável "conteudo" deve ser inicializada com o primeiro tipo de conteudo passado
	 * (primeira posição de "conteudos")
	 * */
	public VagaoLiquidos(String codigo, int capacidade, ConteudoLiquido... conteudos) {
		super(codigo);
		this.capacidade = capacidade;
		/* Percorre o vetor de argumentos passados
		 * e vai atribuindo a String daquele tipo enum(conteudos) para cada elemento
		 * do vetor de String
		 */
		liquidostranspotaveis = new ArrayList<ConteudoLiquido>();
		for(ConteudoLiquido i: conteudos){
			liquidostranspotaveis.add(i);
		}
	}

	/* TODO retornar capacidade do vagão */
	public int getCapacidade() {
		return capacidade;
	}

	/**
	 * Retorna a representação deste vagão como String.
	 */
	public String toString() {
		String retorno = "L|" + getCodigo();
		retorno += conteudosAceitos();
		if (inflamavel())
			retorno += "I";
		else
			retorno += "N";
		return retorno + "|" + getCapacidade() + "|" + ConteudoLiquido.stringFormat(conteudo) + "|" + quantidadeCarregada();
	}

	/* TODO retornar uma String com a representação dos conteúdos aceitos.
	 * Formato: |conteudo1|conteudo2|...|conteudon|
	 * Representação String dos conteudos aceitos deve vir do método stringFormat.
	 * Considerar que sempre existirá pelo menos um tipo de conteúdo aceito.
	 * A ordem dos conteúdos deve ser a mesma dada no construtor (parâmetro conteudos) 
	 */
	private String conteudosAceitos() {
		String retorno = "|";
		for(ConteudoLiquido i: liquidostranspotaveis){
			if(i.equals(ConteudoLiquido.AGUA))
				retorno += "AG" + "|"; 
			if(i.equals(ConteudoLiquido.ALCOOL))
				retorno += "AL" + "|"; 
			if(i.equals(ConteudoLiquido.PETROLEO))
				retorno += "PE" + "|"; 
		}
		return retorno;
	}

	/* TODO retornar true se este vagão é potencialmente inflamável, false caso contrário
	 * Um vagão é potencialmente inflamável se seu conteúdo atual pode ser inflamável.
	 * (Atenção, a implementação é diferente da usada na parte anterior)
	 */
	public boolean inflamavel() {
		inflamabilidade = false;
		if(!carregado()){//Não esta carregado
			//inflamabilidade permanece false
			return false;
		}
		else{//esta carregado
			//Checar o tipoatualcarregado se este é inflamável
			if(conteudo.equals(ConteudoLiquido.ALCOOL)||conteudo.equals(ConteudoLiquido.PETROLEO)){
				inflamabilidade = true;
				return true;
			}
			return false;//o tipoatualcarregado era não inflamável
		}
	}
	/*O que faz:
	 * (non-Javadoc)
	 * @see Carregavel#carregarCarga(int)
	 */
	@Override
	public boolean carregarCarga(int quantidade) {
		if((this.capacidade - this.ocupacao) >= quantidade){
			this.ocupacao =+quantidade;
			this.quantidadeatualcarregada = quantidade;
			return true;//este vagão é suficiente
		}
		else{
			this.quantidadeatualcarregada = this.getCapacidade()- this.ocupacao;//o espaço que restava para ser totalmente ocupado a capacidade do vagão
			this.ocupacao = this.getCapacidade();//foi totalmente ocupado
			return false; //este vagão não é suficiente
		}
	}
	/* O que faz:
	 * (non-Javadoc)
	 * @see Carregavel#carregado()
	 */
	@Override
	public boolean carregado() {
		int cheio = getCapacidade();
		if( ocupacao == cheio) return true;
		else return false;
	}
	/*O que faz:
	 * (non-Javadoc)
	 * @see Carregavel#quantidadeCarregada()
	 */
	@Override
	public int quantidadeCarregada() {
		return quantidadeatualcarregada;
	}

	/**
	 * TODO alterar conteudo atualmente sendo usado pelo vagão
	 */
	public void setConteudoUsado(ConteudoLiquido conteudo) {
		this.conteudo = conteudo;
	}


	/**
	 * TODO retorna true se o conteúdo passado por parâmetro puder ser aceito
	 */
	public boolean aceitaConteudo(ConteudoLiquido conteudo) {
		int vazio = 0;
		//Existindo uma carga inicialmente carregada de um certo tipo
		
		if(ocupacao != vazio){
			if(conteudo == this.conteudo) return true;
			else return false;
		}
		//Não possuia nenhuma carga carregada
		//Checar tipo carregáveis neste vagão
		//Havendo mesmo tipo retorna true e false, caso contrário
		else{
			for(ConteudoLiquido i: liquidostranspotaveis){
				if(i.equals(conteudo)) return true;
			}//termino do laço
			//não encontrou nenhum tipo de conteudo igual ao pedido
			return false;
		}
	}
}
